#ifndef SCENE_H
#define SCENE_H

#include <vector>

#include "Observateur.h"
#include "Couleur.h"
#include "Image.h"
#include "Objet.h"
#include "Vecteur.h"
#include "Source.h"
#include "Illumination.h"

enum typeRaytrace
{
	normal, anti_aliasing, anti_aliasing_adaptatif
};

class Scene
{
private:
	Observateur obs;
	std::vector<Objet*> objets;
	Image* img;
	Couleur couleur_fond;
	std::vector<Source*> sourcesLumiere;
	Illumination* ill;
	typeRaytrace type;


public:
	Scene();
	Scene(Observateur obs, std::vector<Objet*> objs, Image* img, Couleur couleur_fond, std::vector<Source*> src, Illumination* ill, 
		typeRaytrace type);
	~Scene();

	Observateur getObservateur();
	std::vector<Objet*> getObjets();
	Image getImage();
	Couleur getCouleur();
	typeRaytrace getTypeRaytrace();

	void setObservateur(Observateur o);
	void setObjets(std::vector<Objet*> objs);
	void setImage(Image i);
	void setCouleur(Couleur c);
	void setTypeRaytrace(typeRaytrace type1);

	void ajouteObjet(Objet *o);
	bool supprimeObjet(Objet *o);

	void Raytrace();
	void Raytrace_adaptative() ;
	void Raytrace_nonAntiAliasing() ;
	void Raytrace_antiAliasing() ;
	Couleur nonAntiAliasing(int x, int y, Rayon r);
	Couleur div(float i, float j, float i2, float j2, int cpt);
	Couleur antiAliasing(int x, int y, Rayon r);
	Couleur calculCouleur(Rayon r, Couleur fond, int niveau);

	bool mustShootBoiteEnglobante(Rayon ray, BoiteEnglobante bb);

	bool LoadObjFile(const char* filename);
};


#endif